#ifndef UL_MOD_DEFINE_H_ 
#define UL_MOD_DEFINE_H_
#include <stdint.h>
#include <stddef.h>
#include <sys/types.h>
#include "ul_memory_pool.h"
namespace LinuxNetworkUtility
{
  struct UlModInfo
  {
    UlModInfo()
    {
      mod_id_  = 0;
      mod_name_ = NULL;
    }
    int32_t mod_id_;
    const char * mod_name_;
  };

  static const int32_t G_MAX_MOD_NUM = 2048;
  extern UlModInfo UL_MOD_SET[G_MAX_MOD_NUM]; 


#define DEFINE_MOD(mod_name) mod_name

#define ADD_MOD(mod_name)\
  do \
  {\
    if (UlModIds::mod_name <= UlModIds::UL_MOD_END\
    && UlModIds::mod_name >= UlModIds::UL_MOD_DEFAULT \
    && UlModIds::mod_name < G_MAX_MOD_NUM) \
    {\
      UL_MOD_SET[UlModIds::mod_name].mod_id_ = UlModIds::mod_name; \
      UL_MOD_SET[UlModIds::mod_name].mod_name_ = # mod_name;\
    }\
  }while (0) 

  /// 使用方法：
  /// 1. 在UlModIds中定义自己的模块名称, e.x. UL_MS_CELL_ARRAY
  /// 2. 在init_ob_mod_set中添加之前定义的模块名称，e.x. ADD_MOD(UL_MS_CELL_ARRAY)
  /// 3. 在调用ob_malloc的时候，使用定义的模块名称作为第二个参数，e.x. ob_malloc(512, UlModIds::UL_MS_CELL_ARRAY)
  /// 4. 发现内存泄露，调用ob_print_memory_usage()打印每个模块的内存使用量，以发现内存泄露模块
  /// 5. 也可以通过调用ob_get_mod_memory_usage(UlModIds::UL_MS_CELL_ARRAY)获取单个模块的内存使用量
  class UlModIds
  {
  public:
    enum 
    {
      UL_MOD_DEFAULT,
      /// define modules here
      UL_NETWORK,
      UL_THREAD_BUFFER,

      UL_MOD_END
    };
  };

  inline void init_ul_mod_set()
  {
    ADD_MOD(UL_MOD_DEFAULT);
    /// add modules here, modules must be first defined
    ADD_MOD(UL_NETWORK);
    ADD_MOD(UL_THREAD_BUFFER);

    ADD_MOD(UL_MOD_END);
  }
  class UlModSet : public UlMemPoolModSet
  {
  public:
    UlModSet();
    virtual ~UlModSet()
    {
    }
    virtual int32_t get_mod_id(const char * mod_name)const;
    virtual const char * get_mod_name(const int32_t mod_id) const;
    virtual int32_t get_max_mod_num()const;

    virtual void malloc(const int64_t size, const int32_t mod_id);
    virtual void free(const int64_t size, const int32_t mod_id);
    virtual void print_mod_memory_usage();
  private:
    int32_t mod_num_;
    int64_t mod_memory_usage_[G_MAX_MOD_NUM];
  };
}

#endif /* OCEANBASE_COMMON_UL_MOD_DEFINE_H_ */
